package com.desire.homework;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Objects;

/**
 * @author desire
 */
public class _31_统计代码 {
    public static long codeRows = 0;
    public static long fileNums = 0;

    public static long nullLines = 0;

    public static long annotationLines = 0;


    public static void main(String[] args) {


        //getDirs(new File("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\java\\com\\desire"));
        String pp = "C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\java\\com\\desire";
        String path = "C:\\\\Users\\\\desire\\\\Desktop\\\\javaProject\\\\01-javaBase\\\\src\\\\main\\\\java\\\\com\\\\desire\\\\homework\\\\_31_统计代码.java";
        String p = "C:\\Program Files\\Java\\jdk-17.0.1\\lib\\src";
        getDirs(new File(pp));
        System.out.println("代码总行数: " + codeRows);
        System.out.println("文件数: " + fileNums);
        System.out.println("空行: " + nullLines);
        System.out.println("注释行(包括行内注释): " + annotationLines);

    }

    /**
     * 获取注释行
     *
     * @param file
     * @return
     */
    public static long getAnnotationLines(File file) {
        long lines = 0;
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            while (br.ready()) {
                String line = br.readLine();
                // 单行注释(包括行内注释)  多行注释
                if (line.trim().matches("(//|/\\*|\\*).*") || line.trim().matches(".*//[a-zA-Z_0-9\\u4e00-\\u9fa5\\s]*")) {
                    lines++;
                }
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lines;
    }

    /**
     * 统计项目的文件数
     *
     * @param file
     */
    public static void getDirs(File file) {
        if (file.exists() && file.isDirectory()) {
            for (File listFile : Objects.requireNonNull(file.listFiles())) {
                if (listFile.isDirectory()) {
                    getDirs(listFile);
                } else if (listFile.isFile() && listFile.getName().toLowerCase().endsWith(".java")) {
                    fileNums++;
                    codeRows += rows(listFile);
                    nullLines += getNullLines(listFile);
                    annotationLines += getAnnotationLines(listFile);
                }
            }
        } else if (file.isFile() && file.exists()) {
            rows(file);
            getNullLines(file);
            getAnnotationLines(file);
        }
    }

    public static long getNullLines(File file) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            nullLines = br.lines().filter(e -> e.trim().length() == 0).count();
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return nullLines;
    }

    /**
     * 统计项目的代码行数
     *
     * @param file
     * @return
     */
    private static long rows(File file) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            codeRows = reader.lines().filter(e -> e.trim().length() > 0).count();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return codeRows;
    }
}
